package cn.tedu.ivos.base.annotation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * <p>
 * {@link IntegerOnlyValidator} 是对 {@link IntegerOnly} 注解的具体实现类。
 * 它用于验证目标字段是否为合法的整数类型（包括：
 * - Integer 对象
 * - 可解析为 Integer 的字符串（如 "123"）
 * </p>
 *
 * <p>
 * 该校验器不会校验 null 值，null 判断应由其他注解（如 {@link jakarta.validation.constraints.NotNull}）完成。
 * </p>
 */
public class IntegerOnlyValidator implements ConstraintValidator<IntegerOnly, Object> {

    /**
     * 初始化方法，通常不需要执行任何操作。
     *
     * @param constraintAnnotation 被校验的注解对象
     */
    @Override
    public void initialize(IntegerOnly constraintAnnotation) {
        // 不需要初始化逻辑
    }

    /**
     * 执行实际的校验逻辑。
     *
     * @param value 被校验的字段值
     * @param context 校验上下文，用于构建错误信息
     * @return 如果校验通过返回 true，否则返回 false
     */
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) {
            return true; // 由 @NotNull 控制
        }

        if (value instanceof Integer) {
            return true; // 已是 Integer 类型，直接通过
        }

        try {
            // 尝试将值转换为字符串并解析为 Integer
            Integer.parseInt(value.toString());
            return true;
        } catch (NumberFormatException e) {
            // 解析失败，不是合法整数
            return false;
        }
    }
}
